
#ifndef KLINEWIDGET_H
#define KLINEWIDGET_H

#include <QWidget>
#include <QVector>
#include <QPointF>
#include <QPen>
#include <QBrush>

// K线数据结构
struct KLineData {
    qreal open;   // 开盘价
    qreal close;  // 收盘价
    qreal high;   // 最高价
    qreal low;    // 最低价
    QString date; // 日期
};

class KLineWidget : public QWidget
{
    Q_OBJECT
public:
    explicit KLineWidget(QWidget *parent = nullptr);

    // 设置K线数据
    void setKLineData(const QVector<KLineData>& data);

    // 设置视图范围
    void setViewRange(int start, int count);

protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;

private:
    // 绘制K线
    void drawKLines(QPainter& painter);
    // 绘制坐标轴和网格
    void drawAxes(QPainter& painter);
    // 绘制十字光标和数据提示
    void drawCrosshair(QPainter& painter);
    // 计算价格到Y坐标的转换
    int priceToY(qreal price) const;
    // 计算X坐标到索引的转换
    int xToIndex(int x) const;
    // 计算索引到X坐标的转换
    int indexToX(int index) const;

    QVector<KLineData> m_klineData;  // K线数据
    int m_startIndex;                // 起始索引
    int m_displayCount;              // 显示数量
    qreal m_maxPrice;                // 最高价
    qreal m_minPrice;                // 最低价
    int m_hoveredIndex;              // 鼠标悬停的索引
    bool m_showCrosshair;            // 是否显示十字光标

    // 绘图区域边距
    int m_marginLeft;
    int m_marginRight;
    int m_marginTop;
    int m_marginBottom;

    // 画笔和画刷
    QPen m_upPen;    // 上涨K线画笔
    QPen m_downPen;  // 下跌K线画笔
    QBrush m_upBrush;// 上涨K线画刷
    QBrush m_downBrush;// 下跌K线画刷
    QPen m_axisPen;  // 坐标轴画笔
    QPen m_gridPen;  // 网格线画笔
    QPen m_crossPen; // 十字光标画笔
};

#endif // KLINEWIDGET_H
